AB实现双方通信

您所在的位置:网站首页 ab plc通信 AB实现双方通信

AB实现双方通信

#AB实现双方通信| 来源: 网络整理| 查看: 265

题目要求: 通过C语言编写一个程序,程序中需要有两个进程,假设这两个进程是A和B,通过这两个进程模拟一个类似QQ聊天的情景,A进程和B进程分别代表通话一方,A进程能够发消息给B进程,同时还能接收B进程发送过来的消息,同样的,B进程能发送消息给A,同时接收A进程发送来的消息。

socket网络编程有几个步骤:

服务器: 1.socket()函数 2.bind()函数 3.listen()函数 4.accept()函数 5.read(),write(),close()等一系列文件相关的函数

客户端: 1.socket()函数 2.connect()函数 3.read(),write(),close()等一系列文件相关的函数

一、服务器代码:

Server.c: #include #include #include #include #include #include #include //头文件 int main(int argc,char **argv) { int s_fd; int c_fd; //定义两个socket描述符,一个客户端一个服务器的 char msg[128]={0}; char readBuf[128]={0}; //定义两个字符串数组一个用来接收另一个用来发送。 struct sockaddr_in s_addr; struct sockaddr_in c_addr; //定义两个sockaddr_in类型的结构体一个用于服务器一个客户端 if(argc!=3) { printf("Number Error!\n"); exit(-1); }//我们运行程序的时候要输入三个变量,一个运行文件,一个IP地址,还有一个端口号(他们的定义在实验三里边有提到) //socket // int socket(int domain, int type, int protocol); s_fd=socket(AF_INET,SOCK_STREAM,0);//第一个变量为协议 第二个为socket类型 第三个默认为0,表示自动匹配。 if(s_fd!=-1) { printf("Socket Success!\n"); } else { printf("Socket Error!\n"); exit(-1); } //上面创建了一个socket描述字,但没有一个具体的地址,用并bind()函数绑定地址 //bind // int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); s_addr.sin_family=AF_INET;//协议 AF_INET决定了要用ipv4的地址和16位的端口号组合 s_addr.sin_port=htons(atoi(argv[2]));//端口号转化为网络字节序 inet_aton(argv[1],&s_addr.sin_addr);//IP地址 bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//绑定s_fd和s_addr //listen监听函数 // int listen(int sockfd, int backlog); listen(s_fd,10);//第一个参数为客户端描述字,第二个是最大连接个数 //accept // int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); int len=sizeof(struct sockaddr_in); while(1) { c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&len);//没有连接就会一直阻塞到accept。 if(c_fd!=-1) { printf("Accept Success!\n"); } else { printf("Accept Error!\n"); } if(fork()==0)//当有连接后创建一个子进程来读客户端发送过来的数据 { while(1) { memset(readBuf,0,sizeof(readBuf));//每消息读取一次后将readBuf清零 read(c_fd,readBuf,sizeof(readBuf));//read函数第一个变量是客户端socket描述符(从哪儿读),第二个变量是读到哪里去,第三个变量是读多少。 printf("FROM client:%s\n",readBuf);//打印 } } else//父进程发送数据到客户端 { while(1) { memset(msg,0,sizeof(msg));//清零 printf("Inptu: "); gets(msg);//将输入的内容保存到msg里面 write(c_fd,msg,strlen(msg));//write函数第一个变量也是客户端socket描述符(写到哪儿去),第二个变量是需要写的内容,第三个变量是要写的内容的大小。 } } } return 0; }

客户端代码:

client.c #include #include #include #include #include #include #include int main(int argc ,char **argv) { int c_fd; int n_read; int n; char buf[128]={0}; char readBuf[128]={0}; struct sockaddr_in c_addr; if(argc !=3) { printf("Number Error!\n"); exit(-1); } c_fd=socket(AF_INET,SOCK_STREAM,0); if(c_fd!=-1) { printf("Socket Success!\n"); } else { printf("Socket Failed!\n"); exit(-1); } c_addr.sin_family=AF_INET; c_addr.sin_port=htons(atoi(argv[2])); inet_aton(argv[1],&c_addr.sin_addr);//这些和服务器代码是一样的,意思也相同。 //connect // int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); while(1) { n=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in)); //connect函数第一个参数对应客户端的socket描述字,第二个参数为服务器的socket地址,第三个参数表示socket地址的大小 if(n==-1) { printf("Connect Faileed!\n"); exit(-1); } else { printf("Connect Success!\n"); } if(fork()==0) { while(1) { memset(buf,0,sizeof(buf)); printf("Input: "); gets(buf); write(c_fd,buf,strlen(buf)); } } else { while(1) { memset(readBuf,0,sizeof(readBuf)); read(c_fd,readBuf,sizeof(readBuf)); printf("From Serever :%s\n",readBuf); } } } return 0; }

我们的工程文件夹里面应该是有两个c文件的,一个服务器一个客户端。 在这里插入图片描述 编译

gcc server.c -o server gcc client.c -o client

编译之后就会增加两个可执行文件。 在这里插入图片描述 然后ifconfig获得虚拟IP地址 在这里插入图片描述 如果输入ifconfig后为下面这样: 在这里插入图片描述 提示没有网络相关工具sudo apt install net-tools下载就可以了

我们来看看结果:

输入./server 172.20.10.5 6666然后回车运行,再Ctrl+a/t+t重新打开一个终端在刚才的目录下面运行client

如图中所示: 在这里插入图片描述

客户端发送数据给服务器

在这里插入图片描述

服务器发送数据给客户端

在这里插入图片描述 大致完成!

AB进程间通信



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3